
package ChatNI;

import common.Fichier;
import common.Message;
import java.io.*;
import java.net.*;
import java.util.Observable;
import java.util.logging.*;

/**
 *Classe utilisée pour la communcation via TCP
 * Elle sert pour écouter le médium avant de transmettre un message
 * @author Marion et Nicolas
 */

public class TCPecoute implements Runnable{
    private ServerSocket server;
    private Socket socketFromClient;
    private Thread thread;
    private Boolean communication = true;
    
    /**
     * Ce constructeur permet d'initialiser le serverSocket sur son port
     * Ensuite, il lance un thread pour ecouter
     */
    public TCPecoute (){
        try {
            server = new ServerSocket(ChatNI.numPortTCPecoute);
            thread = new Thread(this);
            thread.start();
        } catch (IOException ex) {
            System.out.println("Erreur dans le constructeur TCPecoute");
        }
    }
   
  /**
     * Pas besoin de méthode pour recevoir car la réception se fait par blocs de 1024 octets
     */
  @Override
     public void run() {
        while (communication) {
        try {
                socketFromClient = server.accept();
                System.out.println("Nouvelle connection TCP");
                
                byte[] tablOctets = new byte[1024];
                
                String filePath = System.getProperty("user.home" ) + File.separator + "Desktop" + File.separator + "FichierReçu.txt"; 
                FileOutputStream fos = new FileOutputStream(filePath);
                InputStream is = socketFromClient.getInputStream();         // On recupere l'input du Client
                BufferedInputStream bis = new BufferedInputStream(is,1024); // Notre bufferInput (taille 1024)

                int lecture = 0;
                int compteur = 1024;
                while ((lecture = bis.read(tablOctets, 0, 1024)) != -1) {   // On lit notre buffer par block de 1024
                    compteur = compteur + 1024;
                    fos.write(tablOctets, 0, lecture);                      // on écrit ce qu'on lit dans le FileOutput
                }
                System.out.println("On a reçu : " + compteur+" octets");
                
                // Envoie de l'accuse de reception au client..
                ObjectOutputStream oos = new ObjectOutputStream(socketFromClient.getOutputStream());
                oos.flush();
                oos.writeObject("Valide");
                System.out.println("Accuse de reception correctement envoye au client !!");

        } catch (IOException e) {
            System.out.println("Erreur dans le run TCP");
        }          
    }
}
  
    
    /**
     * Arrêt de l'écoute TCP
     */
    public void stop(){
        try {
            communication = false;
            server.close();
            thread.interrupt();
        } catch (IOException ex) {
            Logger.getLogger(TCPecoute.class.getName()).log(Level.SEVERE, null, ex);
        }
        thread.interrupt();
    }

}
